#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO重映射 -- AFIO口*/
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);			//开启AFIO的时钟，重映射必须先开启AFIO的时钟
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);			//将TIM2的引脚部分重映射，具体的映射方案需查看参考手册
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);		//将JTAG引脚失能，作为普通GPIO引脚使用
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;					//GPIO的输出是外设来的，所以要配置复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//将PA0引脚初始化为上拉输入
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);									//选择内部时钟
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频，选择不分频，此参数用于配置滤波器时钟，不影响时基单元功能，就是滤波器抖动干扰的频率，要在这个频率f内N个采样点全部是相同的频率，就证明抖动干扰消除了
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式，选择向上计数
	TIM_TimeBaseInitStruct.TIM_Period = 100-1;						//计数周期，即ARR的值，就是重装的设定值
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;					//预分频器，即PSC的值，因为自己设定的是1s，所以计算出来的
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;				//重复计数器，高级定时器才会用到
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);					//将结构体变量交给TIM_TimeBaseInit，TIM_TimeBaseInit配置TIM2的时基单元	
	
	
	/*TIM输出比较OC配置*/
	TIM_OCInitTypeDef TIM_OCInitStruct;								//TIM的OC配置，里面有很多的是高级定时器需要的，一般是里面由N的就是高级定时器的，通用的一般只有以下的需要配置，但是其他的没有设置，所以需要先初始化，再配置需要的，这样就不会造成干扰
	TIM_OCStructInit(&TIM_OCInitStruct);							//TIM_OCStructInit就是赋初始值，一般很多都有StructInit，都是这个目的，就是先赋初始值，再去单个的改变
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;					//输出比较模式，选择PWM的模式1
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;			//极性选择，Polarity就是极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;		//输出使能
	TIM_OCInitStruct.TIM_Pulse = 0;									//这里就是CCR的值
	TIM_OC1Init(TIM2,&TIM_OCInitStruct);							//TIM_OC1Init是通道1初始化，因为是PA0口是通道1
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);											//使能TIM2，定时器开始运行
}

void TIM2_setcompara(uint16_t compare)
{
	TIM_SetCompare1(TIM2,compare);									//TIM_SetCompare1是用来单独修改通道1的CCR的值，TIM_SetComparex，就是修改通道x的CCR，因为我这里ARR+1是100，所以我才可以直接通过修改CCR，来修改占空比，来模拟PWM
}

/**
  * 函    数：PWM设置PSC
  * 参    数：Prescaler 要写入的PSC的值，范围：0~65535
  * 返 回 值：无
  * 注意事项：PSC和ARR共同决定频率，此函数仅设置PSC的值，并不直接是频率
  *           频率Freq = CK_PSC / (PSC + 1) / (ARR + 1)
  */
void PWM_SetPrescaler(uint16_t Prescaler)
{
	TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Immediate);//设置PSC的值，Prescaler就是需要设置的值，TIM_PSCReloadMode_Immediate表示立刻生效，还有一个TIM_PSCReloadMode_Update是周期结束后生效
}

